package opf5.ui;

import java.awt.EventQueue;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import opf5.casosDeUso.JugadorDTO;
import opf5.casosDeUso.LoginDependiente;
import opf5.casosDeUso.PartidoDTO;
import opf5.entities.dominio.Jugador;
import opf5.entities.dominio.Partido;
import opf5.entities.excepciones.OperacionNoPermitidaException;
import opf5.entities.repositorios.RepositorioJugadores;
import opf5.entities.repositorios.RepositorioPartidos;

import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class VistaBajaPartidos extends LoginDependiente {

	private JFrame frame;
	private OPF5TablaPartidos tablaPartidos;
	private JButton btnDarmeDeBaja;
	private OPF5TablaJugadores tablaJugadores;
	private RepositorioPartidos repositorioPartidos;
	private List<Partido> partidosInscriptos;
	private RepositorioJugadores repositorioJugadores;
	private List<Jugador> jugadores;
	private JLabel lblPartidosInscriptos;

	public VistaBajaPartidos(RepositorioPartidos repositorioPartidos,
			RepositorioJugadores repositorioJugadores) {
		this.repositorioPartidos = repositorioPartidos;
		this.repositorioJugadores = repositorioJugadores;
	}

	/**
	 * Initialize the contents of the frame.
	 * @wbp.parser.entryPoint
	 */
	public void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 416, 480);
		frame.getContentPane().setLayout(null);
		
		tablaPartidos = new OPF5TablaPartidos(new String[] {
				"Fecha", "Lugar", "Inscriptos"
		});
		tablaPartidos.setBounds(22, 39, 368, 198);
		frame.getContentPane().add(tablaPartidos);
	
		ListSelectionModel listSelectionModel = tablaPartidos.table.getSelectionModel();
	    listSelectionModel.addListSelectionListener(new ListSelectionListener() {
			@Override
			public void valueChanged(ListSelectionEvent arg0) {
				cargarJugadores();
			} 	
	    });
		
		btnDarmeDeBaja = new JButton("Darme de baja");
		btnDarmeDeBaja.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				try {
					runDarDeBaja();
				} catch (OperacionNoPermitidaException e) {
					JOptionPane.showMessageDialog(frame, e.mensaje);
				}
			}
		});
		btnDarmeDeBaja.setBounds(232, 410, 158, 25);
		frame.getContentPane().add(btnDarmeDeBaja);
		
		JLabel lblSeleccioneUnRemplazo = new JLabel("Opcionalmente seleccione su reemplazo");
		lblSeleccioneUnRemplazo.setBounds(22, 269, 298, 15);
		frame.getContentPane().add(lblSeleccioneUnRemplazo);
		
		tablaJugadores = new OPF5TablaJugadores();
		tablaJugadores.setBounds(22, 296, 368, 95);
		frame.getContentPane().add(tablaJugadores);
		
		lblPartidosInscriptos = new JLabel("Partidos");
		lblPartidosInscriptos.setBounds(20, 14, 191, 14);
		frame.getContentPane().add(lblPartidosInscriptos);

		
		this.cargarDatos();
		
		final VistaBajaPartidos window = this;
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});

	}

	private void cargarDatos() {
		this.tablaJugadores.limpiar();
		this.tablaPartidos.limpiar();
		this.cargarPartidos();
	}

	protected void runDarDeBaja() {
		int indicePartido = tablaPartidos.getIndice();
		if (indicePartido < 0) {
			JOptionPane.showMessageDialog(frame, "Debe elegir un partido.");
		} else {
			int indiceReemplazo = tablaJugadores.getIndice();
			if (indiceReemplazo < 0) {
				runDarDeBajaSinReemplazo();
			} else {
				runDarDeBajaConReemplazo();
			}
			cargarDatos();
		}
		
		JOptionPane.showMessageDialog(frame, "Baja satisfactoria.");
		this.frame.setVisible(false);
	}

	private void runDarDeBajaConReemplazo() {
		Partido partido = partidosInscriptos.get(this.tablaPartidos.getIndice());
		Jugador reemplazo = this.jugadores.get(this.tablaJugadores.getIndice());
		partido.darDeBajaConReemplazo(jugador, reemplazo);
	}

	private void runDarDeBajaSinReemplazo() {
		int respuesta = JOptionPane.showConfirmDialog(frame, "Esta seguro de que no desea especificar un reemplazo?"
				+ "\nEsto tendra como consecuencia una infraccion.");
		
		if (respuesta == 0) {
			partidosInscriptos.get(this.tablaPartidos.getIndice()).darDeBajaSinReemplazo(jugador);;
		}
		
	}

	protected void cargarJugadores() {
		if (tablaPartidos.getIndice() < 0 ) {return;}
		Partido partido = this.partidosInscriptos.get(this.tablaPartidos.getIndice());
		jugadores = this.repositorioJugadores.getJugadoresReemplazo(this.jugador, partido);
		tablaJugadores.cargarJugadoresModelo(jugadores);
	}

	private void cargarPartidos() {
		tablaJugadores.limpiar();
		partidosInscriptos = this.repositorioPartidos.getPartidosNoJugadosDe(this.jugador);
		tablaPartidos.cargarPartidosModelo(partidosInscriptos);		
	}
}
